// **********************************************************************
// 
// <copyright>
// 
//  BBN Technologies
//  10 Moulton Street
//  Cambridge, MA 02138
//  (617) 873-8000
// 
//  Copyright (C) BBNT Solutions LLC. All rights reserved.
// 
// </copyright>
// **********************************************************************
// 
// $Source: /cvs/distapps/openmap/src/openmap/com/bbn/openmap/OMComponent.java,v $
// $RCSfile: OMComponent.java,v $
// $Revision: 1.7 $
// $Date: 2004/10/14 18:05:39 $
// $Author: dietrick $
// 
// **********************************************************************

package com.bbn.openmap;

import java.util.Properties;

/**
 * A OMComponent is an OpenMap component that does two basic things: it is a
 * MapHandlerChild, so it knows how to use the MapHandler to find other
 * components it needs, and it is a PropertyConsumer, so it can be configured by
 * a set of Properties. An OMComponent is a perfect candidate to be created by
 * being listed in the openmap.components property of the openmap.properties
 * file. Override the findAndInit() and findAndUndo() methods to test for and
 * connect to other components added to the MapHandler.
 */
public class OMComponent
        extends MapHandlerChild
        implements PropertyConsumer {

    /**
     * All OMComponents have access to an I18n object, which is provided by the
     * Environment.
     */
    protected I18n i18n = Environment.getI18n();

    /**
     * Token uniquely identifying this component in the application properties.
     */
    protected String propertyPrefix = null;

    /**
     * Sets the properties for the OMComponent.
     * 
     * @param props the <code>Properties</code> object.
     */
    public void setProperties(java.util.Properties props) {
        setProperties(getPropertyPrefix(), props);
    }

    /**
     * Sets the properties for the OMComponent.
     * 
     * @param prefix the token to prefix the property names
     * @param props the <code>Properties</code> object
     */
    public void setProperties(String prefix, java.util.Properties props) {
        setPropertyPrefix(prefix);

        // In a subclass, you can use this to get "" if the prefix
        // isn't defined, or "prefix." if it is. Either way, you can
        // then append the realPrefix with wild abandon...
        // String realPrefix =
        // PropUtils.getScopedPropertyPrefix(prefix);
    }

    /**
     * PropertyConsumer method, to fill in a Properties object, reflecting the
     * current values of the OMComponent. If the component has a propertyPrefix
     * set, the property keys should have that prefix plus a separating '.'
     * prepended to each property key it uses for configuration.
     * 
     * @param props a Properties object to load the PropertyConsumer properties
     *        into. If props equals null, then a new Properties object should be
     *        created.
     * @return Properties object containing PropertyConsumer property values. If
     *         getList was not null, this should equal getList. Otherwise, it
     *         should be the Properties object created by the PropertyConsumer.
     */
    public Properties getProperties(Properties props) {
        if (props == null) {
            props = new Properties();
        }

        // String prefix = PropUtils.getScopedPropertyPrefix(this);

        return props;
    }

    /**
     * Method to fill in a Properties object with values reflecting the
     * properties able to be set on this PropertyConsumer. The key for each
     * property should be the raw property name (without a prefix) with a value
     * that is a String that describes what the property key represents, along
     * with any other information about the property that would be helpful
     * (range, default value, etc.). For Layer, this method should at least
     * return the 'prettyName' property.
     * 
     * @param list a Properties object to load the PropertyConsumer properties
     *        into. If getList equals null, then a new Properties object should
     *        be created.
     * @return Properties object containing PropertyConsumer property values. If
     *         getList was not null, this should equal getList. Otherwise, it
     *         should be the Properties object created by the PropertyConsumer.
     */
    public Properties getPropertyInfo(Properties list) {
        if (list == null) {
            list = new Properties();
        }
        return list;
    }

    /**
     * Set the property key prefix that should be used by the PropertyConsumer.
     * The prefix, along with a '.', should be prepended to the property keys
     * known by the PropertyConsumer.
     * 
     * @param prefix the prefix String.
     */
    public void setPropertyPrefix(String prefix) {
        propertyPrefix = prefix;
    }

    /**
     * Get the property key prefix that is being used to prepend to the property
     * keys for Properties lookups.
     * 
     * @return the property prefix string
     */
    public String getPropertyPrefix() {
        return propertyPrefix;
    }
}